package com.qfedu.aunt.commons.slot.impl;

import com.alibaba.druid.util.StringUtils;
import com.qfedu.aunt.commons.constance.RedisConstance;
import com.qfedu.aunt.commons.exception.BusinessException;
import com.qfedu.aunt.commons.manager.RedisManager;
import com.qfedu.aunt.commons.result.R;
import com.qfedu.aunt.commons.result.ResponseCode;
import com.qfedu.aunt.commons.slot.base.BaseSlot;
import com.qfedu.aunt.commons.utils.IpUtils;
import com.qfedu.aunt.commons.utils.ResponseUtils;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;

import javax.servlet.http.HttpServletRequest;
import java.util.concurrent.TimeUnit;

/**
 * @author xiaobobo
 * @title: AuthSlot
 * @projectName aunt_commons_2209
 * @description: TODO
 * @date 2022/11/4  15:23
 */
@Component
@Slf4j
public class AuthSlot implements BaseSlot {

    @Autowired
    private RedisManager redisManager;

    @Override
    public void dealReq(HttpServletRequest request) {
        log.info("执行到了:AuthSlot");
//这里需要从请求头中获取我们指定参数的数据
        String current = request.getHeader("current");
        //这里需要进行解密 今天先不解密传递明文
        //去redis中先读取我们的数据
        //还要获取我们的ip地址
        String ipAddress= IpUtils.getIpAddress(request);
        //再获取一个请求的接口地址
        String requestURI = request.getRequestURI();

        //构建一个key(将这一个作为我们的这个key)
        String key= RedisConstance.getReqRecore()+ipAddress+":"+requestURI;
        //接下来获取这个key在Redis中的数据
        String val = (String) redisManager.getString(key);

        if(StringUtils.isEmpty(val)){
            //接下来就可以判断这个值了
            //说明是第一次请求
            //添加数据到Redis同时进行放行
            redisManager.addString(key,current,1, TimeUnit.DAYS);
            log.info("第一次请求.....");
            return ;
        }
        //执行到这里 说明不是第一次请求
        Long  reqTime = Long.parseLong(val);
        //接下来比较如果是两个时间是一样的 那么说明这个是伪造请求
        if(reqTime==Long.parseLong(current)){
            log.info("请求非法攻击.....");
            throw new BusinessException( ResponseCode.REQUEST_EXCEPTION.getCode(),
                    ResponseCode.REQUEST_EXCEPTION.getMessage());
        }
        log.info("请求通过.....");
        //这里也应该将这个数据放进去
        redisManager.addString(key,current,1, TimeUnit.DAYS);
    }
}
